/**
 * 工具函数集合
 * @module utils
 */
const utils = {
	/**
	 * 将数字向下取整并保留两位小数
	 * @param {number} value - 要处理的数字
	 * @returns {string} - 格式化后的字符串，包含两位小数
	 */
	toTwoDecimalDown(value, num = 2) {
		if (isNaN(value)) {
			throw new TypeError('The input value must be a number');
		}
		let factor = Math.pow(10, num); // 计算 10 的 num 次方
		let result = Math.floor(value * factor) / factor; // 向下取整
		return result; // 返回结果
	},

	/**
	 * 字符串格式化过滤器
	 * 保留前8位和后8位，中间用 * 号代替
	 * @param {string} value - 输入的字符串
	 * @returns {string} - 格式化后的字符串
	 */
	formatAddress(value) {
		if (!value || value.length <= 16) {
			return value; // 如果字符串长度小于或等于16，直接返回原字符串
		}
		const start = value.slice(0, 8); // 获取前8位
		const end = value.slice(-8); // 获取后8位
		const masked = '*'.repeat(value.length - 16); // 中间部分用 * 号替代
		return `${start}...${end}`;
	},
	/**
	 * 字符串格式化过滤器
	 * 保留前4位和后4位，中间用 * 号代替
	 * @param {string} value - 输入的字符串
	 * @returns {string} - 格式化后的字符串
	 */
	formatAddress4(value) {
		if (!value || value.length <= 8) {
			return value; // 如果字符串长度小于或等于8，直接返回原字符串
		}
		const start = value.slice(0, 4); // 获取前4位
		const end = value.slice(-4); // 获取后4位
		const masked = '*'.repeat(value.length - 8); // 中间部分用 * 号替代
		return `${start}...${end}`;
	},
	/**
	 * 获取当前钱包名字
	 * 并且加1返回
	 * @param {walletNames} value - 本地钱包的所有名字
	 * @param {str} value - 要提取的链名
	 * @returns {string} - 格式化后的字符串
	 */
	getNextChainNumber(walletNames, str) {
		// 过滤出以 'BSC-' 开头的名字，并提取出数字
		let chainNumbers = walletNames
			.filter(name => name.startsWith(str + "-")) // 过滤出 BSC- 开头的名字
			.map(name => parseInt(name.split('-')[name.split('-').length - 1])) // 提取 BSC- 后面的数字
			.filter(num => !isNaN(num)); // 过滤掉非数字的情况
		if (chainNumbers.length === 0) {
			return 1;
		}
		// 找出最大数字
		let maxNumber = Math.max(...chainNumbers);

		// 返回下一个数字
		return maxNumber + 1;
	},

	/**
	 * 处理科学技术数字显示
	 * 
	 */
	formatNumber(inputNumber) {
		if (isNaN(inputNumber)) {
			return inputNumber
		}
		inputNumber = '' + inputNumber
		inputNumber = parseFloat(inputNumber)
		let eformat = inputNumber.toExponential() // 转换为标准的科学计数法形式（字符串）
		let tmpArray = eformat.match(/\d(?:\.(\d*))?e([+-]\d+)/) // 分离出小数值和指数值
		let number = inputNumber.toFixed(Math.max(0, (tmpArray[1] || '').length - tmpArray[2]))
		return number
	},
};

export default utils;